# -*- coding: utf-8 -*-
"""
tuyaos_guidemo_quickstart 应用构建与静态资源打包脚本
================================================================================

【作用】
  1. 收集并编译 src/*.c
  2. 将应用静态资源拷贝到构建输出目录，最终打入片外 Flash 的 rodata.fatfs

【打包链路】
  工程资源目录  --(fsinstall.py)-->  output/.../images/rodata/...
       --(makefatfs.py)-->  rodata.fatfs  --烧录-->  设备 /rodata/ (只读 FatFS)

【推荐资源目录布局】（在应用根目录下创建 images/，子目录会原样保留）

  images/
  ├── image/          JPG / PNG 等 LVGL 图片（大图推荐 JPG 省空间）
  ├── font/           TTF 字库（需 menuconfig 开启 LV_USE_FREETYPE）
  ├── audio/          内置 MP3 音乐 / 音效（运行时按文件路径播放）
  └── video/          可选，视频等资源

【设备运行时路径】（board.c 将 blk_rodata 挂载为 /rodata）

  资源类型          打包后路径                         代码中引用示例
  ---------------------------------------------------------------------------
  JPG/PNG 图片      /rodata/lvgl_data/image/xxx.jpg    LVGL_IMAGE_PATH("xxx.jpg")
                                                       或 "L:/rodata/lvgl_data/image/xxx.jpg"
  TTF 字库          /rodata/lvgl_data/font/xxx.ttf     LVGL_FONT_PATH("xxx.ttf")
  内置 MP3          /rodata/lvgl_data/audio/xxx.mp3    aic_player_set_uri(player, "/rodata/lvgl_data/audio/xxx.mp3")
  多语言 ini        /rodata/lang/chinese.ini           LVGL_STORAGE_PATH"/lang/chinese.ini"
  字库字符表        /rodata/lang/font.txt              供外部字库生成工具使用，非二进制字库

【与 AI 短提示音的区别】
  tuya_ai_chat 组件的唤醒/联网提示音走 ty_audio_assets（MP3 编译为 C 数组），
  不占 rodata 文件系统。本脚本负责的是“文件型” JPG / MP3 等资源。

【注意】
  - rodata 分区约 4MB，资源总大小需控制；大图用 JPG，音频建议 128kbps
  - 源目录不存在时自动跳过，不影响编译
  - 修改资源后需重新编译，rodata.fatfs 会随 OTA 一起升级
================================================================================
"""

Import('AIC_ROOT')
Import('PRJ_KERNEL')
from building import *
import os

try:
    Import('APP_LOCAL_CPPDEFINES')
except Exception:
    APP_LOCAL_CPPDEFINES = []

try:
    Import('APP_COMPONENTS_CPPPATH')
except Exception:
    APP_COMPONENTS_CPPPATH = []

cwd = GetCurrentDir()


def _rodata_rel_from_lvgl_storage():
    """
    将 menuconfig 中的 LVGL_STORAGE_PATH 转为打包暂存区相对路径。

    LVGL_STORAGE_PATH 运行时为挂载点绝对路径，例如 "/rodata/lvgl_data"。
  fsinstall 的目标路径相对于 output/<prj>/images/，因此需要去掉首尾引号与斜杠。

    @return 例如 "rodata/lvgl_data"
    """
    if GetDepend(['LVGL_STORAGE_PATH']):
        return GetDepend('LVGL_STORAGE_PATH').strip('"/')
    return 'rodata/lvgl_data'


def _append_dir_install(install_list, src_rel, dst_rel, desc):
    """
    若源目录存在，则追加一条 INSTALL 规则。

    @param install_list  INSTALL 列表，元素为 (src_rel, dst_rel) 元组
    @param src_rel       相对于本 SConscript 所在目录的源路径
    @param dst_rel       相对于 output/.../images/ 的目标路径
    @param desc          日志描述，便于编译时确认资源是否被打包
    """
    src_abs = os.path.join(cwd, src_rel)
    if os.path.isdir(src_abs):
        install_list.append((src_rel, dst_rel))
        print('[guidemo] INSTALL %s: %s -> %s' % (desc, src_rel, dst_rel))
    else:
        print('[guidemo] SKIP %s: "%s" not found' % (desc, src_rel))


# ---------------------------------------------------------------------------
# 源文件与头文件路径
# ---------------------------------------------------------------------------
src = Glob('src/*.c')

include = [cwd + '/include']
include += APP_COMPONENTS_CPPPATH

# ---------------------------------------------------------------------------
# 静态资源安装规则（INSTALL → fsinstall.py → rodata.fatfs）
# ---------------------------------------------------------------------------
install = []

# LVGL 资源根目录：图片(JPG/PNG)、字库(TTF)、内置 MP3(audio/) 等均放在 images/ 下
# 整目录递归拷贝，子目录结构在设备上保持不变
lvgl_data_dst = _rodata_rel_from_lvgl_storage()
_append_dir_install(
    install,
    'images/',
    lvgl_data_dst,
    'LVGL assets (image/font/audio/video)',
)

# 多语言配置与字库字符子集描述
_append_dir_install(
    install,
    'lang/',
    'rodata/lang',
    'i18n lang files',
)

# ---------------------------------------------------------------------------
# 注册编译组
# ---------------------------------------------------------------------------
group = DefineGroup(
    'tuyaos_guidemo_quickstart',
    src,
    depend=['LPKG_USING_TUYAOS'],
    CPPPATH=include,
    INSTALL=install,
    LOCAL_CPPDEFINES=APP_LOCAL_CPPDEFINES,
)

Return('group')
